﻿using System;
using System.Collections.Generic;
using System.Text;

namespace IllustratedCsharp7_ch14
{
    /*我们可以在如下地方使用匿名方法
     声明委托变量时作为初始化表达式
    组合委托时在赋值语句的右边
    为委托增加事件时在赋值语句的右边
     */
    class Chapt14_13AnonymousMethod
    {
        delegate int OtherDel(int InParam);
        delegate void SomeDel();    //声明委托类型
        delegate void SomeDel1(int X ,params int[] Y);
        static void _Main()
        {
            //匿名方法
            /*匿名方法表达式的语法包含如下组成部分
             * delegate 类型关键字
             * 参数列表，如果语句块没有使用任何参数列表则可以省略。
             * 语句块，它包含了匿名方法的代码            
             */
            OtherDel del = delegate (int x)
            {
                return x + 20;
            };
            Console.WriteLine("{0}",del(5));
            Console.WriteLine("{0}", del(6));

            //1,返回类型，匿名方法不会显示声明返回值。
            //然而，实现代码本身的行为必须通过返回一个与委托的返回类型相同的值来匹配委托的返回类型

            //2,参数，除了数组参数，匿名方法的参数列表必须 在如下3方面与委托匹配:
            //参数数量
            //参数类型及位置
            //修饰符
            //可能通过使用圆括号为空或省略圆括号来简化匿名就去的参数列表，但必须满足以下两个条件
            //委托的参数列表不包含任何out参数；
            //匿名方法不使用任何参数。
            SomeDel SDel = delegate   //省略参数列表
            {
                PrintMessage();
                Cleanup();
            };
            SDel();

            SomeDel1 SDel1 = delegate (int X, int[] Y) //在匹配的匿名方法中省略关键字params
            {
                Console.WriteLine($"{X} {Y.Length}");
            };
            int[] array = { 1, 2, 3,4};
            SDel1(5,array);
        }

        static void PrintMessage()
        {
            Console.WriteLine("printmessage");
        }
        static void Cleanup()
        {
            Console.WriteLine("Cleanup");
        }
    }
}
